#include"my_stdio.h"
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<stdlib.h>
#include<fcntl.h>


Myfile* my_fopen(const char* filename ,const char* mode)
{
	int fd = 0;
	if(strcmp(mode ,"w")==0)
	{
		fd = open(filename ,O_CREAT | O_WRONLY | O_TRUNC ,UMASK);
	}
	else if(strcmp(mode ,"r")==0)
	{
		fd = open(filename ,O_RDONLY);
	}
	else if(strcmp(mode ,"a")==0)
	{
		fd = open(filename ,O_CREAT | O_WRONLY | O_APPEND ,UMASK);
	}
	else if (strcmp(mode, "r+") == 0) 
	{
        // r+：读写方式打开，文件必须存在，打开后文件指针在开头
        	fd = open(filename ,O_RDWR );
    	} 
	else if (strcmp(mode, "a+") == 0) 
	{
        // a+：读写方式打开，文件不存在则创建，写入时在文件末尾追加，读取时文件指针位置可调整
        	fd = open(filename , O_CREAT | O_RDWR | O_APPEND ,UMASK);
    	}
       	else 
	{
        // 不支持的模式，可根据需求返回错误或做其他处理
        return NULL;
    	}

	if(fd<0) return NULL;
	
	//为新开文件申请空间
	Myfile* fp = (Myfile*)malloc(sizeof(Myfile));
	if(!fp) return NULL;
	
	//初始化成员变量
	fp->fileno = fd;
	fp->flag = FLUSH_LINE;
	fp->buffer[0] = 0;
	fp->curr = 0;
	fp->cap = SIZE;

	return fp;

}



void my_fclose(Myfile* fp)
{
	if(fp->fileno > 0)
	{
		my_fflush(fp ,FORCE);
		fsync(fp->fileno);
		close(fp->fileno);
		free(fp);
	}	


}

static void my_fflush_core(Myfile*fp ,int force)
{
	//如果没有数据直接返回
	if(fp->curr<=0)return;

	if(force == FORCE)
	{
		write(fp->fileno ,fp->buffer ,fp->curr);
		fp->curr = 0;
	}
	else
	{
		//刷新方式为行刷新
		if((fp->flag & FLUSH_LINE) && fp->buffer[fp->curr-1] == '\n')
		{
			write(fp->fileno ,fp->buffer ,fp->curr);
			fp->curr = 0;
		}
		//刷新方式为全刷新
		else if((fp->flag & FLUSH_FULL) && fp->curr == fp->cap)
		{
			write(fp->fileno ,fp->buffer ,fp->curr);
			fp->curr = 0;
		}	
	}
}

int my_fwrite(const char* s ,int size ,Myfile* fp)
{
	//fwrite的本质就是拷贝
	memcpy(fp->buffer+fp->curr ,s ,size);
	fp->curr += size;

	//判断是否符合刷新条件
	my_fflush(fp ,NORMAL);
	return size;
}

void my_fflush(Myfile* fp ,int force)
{
	my_fflush_core(fp ,FORCE);
}

